#ifndef __TOUCH_DRV_H__
#define __TOUCH_DRV_H__
#include <stdio.h>
#include "delay.h"
#include <stdint.h>
#include "gd32f30x.h"
#include "systick.h"
/********************************************ENUM|STRUCT************************************************/
typedef enum {
    TOUCH_I2C_RESULT_OK = 11,      // 成功
    TOUCH_I2C_ERR_DEVICE_ADDR,    // 发送设备地址错误
    TOUCH_I2C_ERR_REGISTER_ADDR,  // 发送寄存器地址错误
    TOUCH_I2C_ERR_WRITE,          // 写数据时出现错误
    TOUCH_I2C_ERR_READ,           // 读数据时出现错误
    TOUCH_I2C_ERR_SLAVE_NO_ACK,   // 从机没有响应
    TOUCH_I2C_OTHER_ERR,              // 其他错误
} TouchResult_e;

/* 触摸点坐标数据结构 */
typedef struct {
    uint16_t x;           // 触摸点X坐标
    uint16_t y;           // 触摸点Y坐标
    uint16_t size;        // 触摸点大小
} TouchPoint_t;

/* 触摸信息结构体 */
typedef struct {
    uint8_t state;        // 1：按下 or 0：未按下
    TouchPoint_t point;
} TouchInfo_t;	          //触摸信息结构体

/********************************************GPIO************************************************/
//SCL引脚配置
#define TOUCH_SCL_PORT     GPIOF
#define TOUCH_SCL_PIN      GPIO_PIN_10
#define TOUCH_SCL_RCU      RCU_GPIOF
//SDA引脚配置  
#define TOUCH_SDA_PORT     GPIOF
#define TOUCH_SDA_PIN      GPIO_PIN_9
#define TOUCH_SDA_RCU      RCU_GPIOF
//RST引脚配置
#define TOUCH_RST_PORT     GPIOB
#define TOUCH_RST_PIN      GPIO_PIN_9
#define TOUCH_RST_RCU      RCU_GPIOB
//INT引脚配置  
#define TOUCH_INT_PORT     GPIOB
#define TOUCH_INT_PIN      GPIO_PIN_12
#define TOUCH_INT_RCU      RCU_GPIOB

/********************************************HONG FUNCTION************************************************/
//控制SCL引脚电平
#define TOUCH_SCL(bit) 	            gpio_bit_write(TOUCH_SCL_PORT, TOUCH_SCL_PIN, bit == 1? SET : RESET)
//控制SDA引脚电平
#define TOUCH_SDA(bit) 	            gpio_bit_write(TOUCH_SDA_PORT, TOUCH_SDA_PIN, bit == 1? SET : RESET)
//控制RST引脚电平
#define TOUCH_RST(bit) 	            gpio_bit_write(TOUCH_RST_PORT, TOUCH_RST_PIN, bit == 1? SET : RESET)
//控制INT引脚电平
#define TOUCH_INT(bit) 	            gpio_bit_write(TOUCH_INT_PORT, TOUCH_INT_PIN, bit == 1? SET : RESET)

//读取SCL引脚电平
#define TOUCH_GET_SCL_PIN_STATE()     gpio_input_bit_get(TOUCH_SCL_PORT, TOUCH_SCL_PIN)
//读取SDA引脚电平
#define TOUCH_GET_SDA_PIN_STATE()     gpio_input_bit_get(TOUCH_SDA_PORT, TOUCH_SDA_PIN)

// 修改SDA输入输出模式 --默认是输出 SDA在不通场景下 由不同设备控制
#define  TOUCH_SET_SDA_MODE_OUT()       gpio_init(TOUCH_SDA_PORT, GPIO_MODE_OUT_OD, GPIO_OSPEED_10MHZ, TOUCH_SDA_PIN)
#define  TOUCH_SET_SDA_MODE_IN()        gpio_init(TOUCH_SDA_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_10MHZ, TOUCH_SDA_PIN)

// 延时的时间直接影响 I2C的发送频率: SCL高  I2C_DELAY() SCL低  T=2*5us =10us   1/10=100kHZ
#define TOUCH_I2C_DELAY()  DelayNus(5)

/********************************************HONG PARAM************************************************/
// 重试次数  等待从机响应 每 I2C_DELAY()--5us 时间读取一次 等待时长 = RETRY_TIMES * I2C_DELAY() =10*5=50us
#define TOUCH_RETRY_TIMES 10

/* GT911 部分寄存器定义 */
#define TOUCH_DEV_WRITE_ADDR 	 	0x28        
#define GT911_CTRL_REG   			0x8040      // GT911控制寄存器
#define GT911_CFGS_REG   			0x8050      // GT911配置起始地址寄存器
#define GT911_PID_REG    			0x8140      // GT911产品ID寄存器

#define GT911_STATUS_REG 			0x814E      // GT911当前检测到的触摸情况
#define GT911_TP1_REG    			0x8150      // 第一个触摸点数据地址
#define GT911_TP2_REG    			0x8158      // 第二个触摸点数据地址
#define GT911_TP3_REG    			0x8160      // 第三个触摸点数据地址
#define GT911_TP4_REG    			0x8168      // 第四个触摸点数据地址
#define GT911_TP5_REG    			0x8170      // 第五个触摸点数据地址

#define DETECT_INTERVAL_TIME        10          // GT911检测间隔时间要求10ms以上
#define TOUCH_POINT_MAX      5  			  // GT911最多5个触摸点
#define TOUCH_UP                    0  // 未按下
#define TOUCH_DOWN                  1  // 按下
/********************************************FUNCTION************************************************/



/**
 * @desc  : 触摸屏驱动初始化
 * @date  : 2025-06-05
 * @author: AnRui
 * @note  : 1.设置GPIO 2.设置从机地址为0x28 3.读取从机id
 */
void TouchDrvInit(void);


/**
 * @desc  : 触点扫描
 * @date  : 2025-06-06
 * @author: AnRui
 * @note  : 两次扫描时间至少大于10ms
 *          读取 GT911_STATUS_REG 状态寄存器
 *              bit7  : butter status
 *              bit0-3:触点数量
 *
 */
void TouchScan(TouchInfo_t* touchInfo_t);
#endif 
